<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>闭包</title>

</head>
<body>
    
</body>
<script>
    // 闭包（closure）指有权访问另一个函数作用域中变量的函数。
    // 一个作用域可以访问另外一个函数的局部变量 
    // 我们fn 外面的作用域可以访问fn 内部的局部变量
    // 闭包的主要作用: 延伸了变量的作用范围
    function fn() {
        var num = 10;
 
        // function fun() {
        //     console.log(num);
 
        // }
        // return fun;
        return function() {
            console.log(num);
        }
    }
    var f = fn();
    f();
    // 类似于
    // var f = function() {
    //         console.log(num);
    //     }
    // var f =  function fun() {
    //         console.log(num);
 
    //     }
</script>
<!-- <script>
    function fn1() {//fn1就是闭包函数
        var num=10
        function fn2(){
            console.log(num);
        }
        fn2()
    }
    fn1()

    function fun1(){
        var num1 = 100
        function fun2(){
            console.log(num1);
        }
        fun2()
    }
    fun1()//闭包
</script> -->
<!-- 
    闭包
    变量作用域
    变量根据作用域的不同分为两种：全局变量和局部变量。
    1. 函数内部可以使用全局变量。
    2. 函数外部不可以使用局部变量。
    3. 当函数执行完毕，本作用域内的局部变量会销毁。
    闭包（closure）指有权访问另一个函数作用域中变量的函数。 ----- JavaScript 高级程序设计
    简单理解就是 ，一个作用域可以访问另外一个函数内部的局部变量。
    在 chrome 中调试闭包 
    1. 打开浏览器，按 F12 键启动 chrome 调试工具。
    2. 设置断点。
    3. 找到 Scope 选项（Scope 作用域的意思）。
    4. 当我们重新刷新页面，会进入断点调试，Scope 里面会有两个参数（global 全局作用域、local 局部作用域）。
    5. 当执行到 fn2() 时，Scope 里面会多一个 Closure 参数 ，这就表明产生了闭包。
 -->
</html>